Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Starejši - zbirka nalog
Funkcije
If stavek
Izpisi
Množice
Nizi
Pisanje in popravljanje programa
Seznami in nizi
Slovarji
Spoznajmo Python
Uvod v funkcije
Zanka for
Zanka while
Uvod v funkcije

Uvod v funkcije


Preproste funkcije

Ata Janez se pred mamo Mojco zelo rad baha s tem, kako dober je v matematiki. Ker zna tudi malo programirati, je sestavil nekaj funkcij, ki računajo preproste matematične izraze, a žal ne delajo tako, kot bi morale. Da pred mamo Mojco ne bo izpadel preveč trapasto, vas prosi, da mu pri sestavljanju funkcij malce pomagate.

1. podnaloga

Sestavite funkcijo izracunaj(x, a, b), ki sprejme števila x, a in b ter vrne vrednost izraza $a*x + b$. Zgled:

>>> izracunaj(5, 2, 3)
13

Uradna rešitev

def izracunaj(x, a, b):
    """Vrne vrednost izraza a*x + b."""
    return a*x + b

2. podnaloga

Sestavite funkcijo linearna_enacba(a, b), ki sprejme števili a in b ter vrne rešitev enačbe $a*x + b = 0$. Predpostavite, da je $a \neq 0$. Zgled:

>>> linearna_enacba(2, 3)
-1.5

Uradna rešitev

def linearna_enacba(a, b):
    """Vrne rešitev linearne enačbe a*x + b = 0."""
    return -b / a

3. podnaloga

Janez sestavlja funkcijo, ki zna za katerokoli leto povedati ali je prestopno ali ni, vendar se mu je pri sestavljanju malce zataknilo. Zopet vas prosi, da mu priskočite na pomoč.

Sestavite funkcijo prestopno(leto), ki vrne True, če je leto leto prestopno v gregorijanskem koledarju, sicer pa vrne False. Zgled:

>>> prestopno(2015)
False
>>> prestopno(2014)
False
>>> prestopno(2012)
True
>>> prestopno(2000)
True
>>> prestopno(1900)
False

Pri tem ne uporabite stavka if!

Uradna rešitev

def prestopno(leto):
    """Vrne True, če je leto prestopno in False sicer."""
    return (leto % 400 == 0) or (leto % 4 == 0 and leto % 100 != 0)

Računanje ploščin

Mama Mojca in ata Janez bosta v kopalnici položila nove ploščice, vendar se še vedno odločata o obliki ploščic, ki jih bosta uporabila. Njuna odločitev temelji predvsem na številu ploščic različnih oblik, ki jih bo potrebno kupiti, da pokrijeta celotno kopalnico. Pri odločitvi jima pomagajte tako, da izračunate ploščine različnih oblik ploščic. Te jima bodo kasneje v veliko pomoč pri izračunu števila ploščic, ki jih bosta potrebovala za svojo kopalnico.

1. podnaloga

Sestavite funkcijo ploscina_pravotnika(a, b), ki sprejme števili a in b ter vrne ploščino pločice pravokotne oblike s stranicama a in b. Zgled:

>>> ploscina_pravokotnika(4, 2)
8

Namig: Nekaj o ploščini pravokotnika si lahko preberete tukaj.

Uradna rešitev

def ploscina_pravokotnika(a, b):
    """Vrne ploščino pravokotnika s stranicama a in b."""
    return a * b

2. podnaloga

Sestavite funkcijo ploscina_kroga(r), ki sprejme polmer kroga r ter vrne ploščino okrogle ploščice z danim polmerom. Zgled:

>>> ploscina_kroga(2)
12.566370614359172

Namig: Nekaj o ploščini kroga si lahko preberete tukaj.

Še en namig: V Pythonu obstaja vgrajena funkcija pi, ki vrne vrednost znane matematične konstante, ki jo boste v tej nalogi potrebovali. Funkcija se nahaja v knjižnici math. Za pomoč si oglejte dokumentacijo.

>>> import math
>>> math.pi
3.141592653589793

Uradna rešitev

import math
def ploscina_kroga(r):
    """Vrne ploščino kroga z radijem r."""
    return math.pi * r**2

3. podnaloga

Sestavite funkcijo ploscina_nkotnika(n, a), ki sprejme števili $n$ in $a$ ter vrne ploščino ploščice v obliki pravilnega $n$-kotnika s stranico $a$. Kot kaže zgled, se glede "čudnega" računanja z decimalnimi števili, ne obremenjujemo. Zgled:

>>> ploscina_nkotnika(4, 2)
4.000000000000001

Namig: Nekaj o ploščini pravilnega n-kotnika lahko preberete tukaj. Pri računanju si pomagajte z vgrajenimi funkcijami pi ter sin ali tan. Funkcije se nahajajo v knjižnici math.

Še en namig: Kadar imamo podano stranico pravilnega $n$-kotnika z dolžino $a$, potrebujemo pa polmer $n$-kotniku očrtanega kroga $R$, ga lahko izračunamo po formuli: $R = \frac{a}{2 \sin(\frac{\pi}{n})}$.

Uradna rešitev

import math

def ploscina_nkotnika(n, a):
    """Vrne ploščino pravilnega n-kotnika s stranico dolžine a."""
    # Pravilni n-kotnik lahko razdelimo na n skladnih enakokrakih
    # trikotnikov, ki imajo vrh v središču n-kotnika.

    # Prvi način:
    # Naj bo a dolžina
    # osnovnice takega trikotnika, h pa njegova višina. Potem je
    # (a / 2) / h = tan(π/n) oziroma h = a / (2 * tan(π/n)).
    # Ploščina enega trikotnika je a * h / 2 = a * 2 / (4 * tan(π/n)).
    # Od tod sledi formula za ploščino n-kotnika.
    # return a**2 * n / (4 * math.tan(math.pi / n))

    # Drugi način:
    # če uporabimo enačbo s spletne strani
    R = a / (2 * math.sin(math.pi/n))
    return 1/2 * n * R**2 * math.sin(2 * math.pi / n)

Delamo s števili

Mama Mojca in ata Janez sta se odpravila v kasino, kjer se bosta preizkusila v različnih igrah.

1. podnaloga

Denar, ki ga bosta zaslužila, si bosta enakovredno razdelila. V primeru, da bosta oba skupaj izgubila nekaj denarja pa si bosta razdelila dolg, ki ga bosta naslednjič poizkusila priigrati nazaj.

Zapišite funkcijo aritmeticna(a, b), ki sprejme znesek $a$, ki ga priigra (oziroma izgubi) Mojca in znesek $b$, ki ga priigra (oziroma izgubi) Janez, ter vrne povprečje obeh zneskov, ki ga izračunamo po formuli $\frac{a + b}{2}$. Zgled:

>>> aritmeticna(3, 9)
6
>>> aritmetica(-12, 5)
-3.5

Povprečju, ki ga računamo na tak način, rečemo aritmetična sredina.

Uradna rešitev

def aritmeticna (a, b):
    """Funkcija vrne aritmetično sredino števil a in b."""
    return (a + b)/2

2. podnaloga

Poleg aritmetične poznamo tudi geometrično sredino. Zapišite funkcijo geometricna(a, b), ki sprejme števili $a$ in $b$ ter vrne njuno geometrično sredino $\sqrt{ab}$. Zgled:

>>> geometricna(3, 12)
6

Namig: v Pythonu obstaja vgrajena funkcija sqrt, ki izračuna koren danega števila. Funkcija se nahaja v knjižnici math. Za pomoč si oglejte dokumentacijo.

Uradna rešitev

import math # da bomo lahko uporabili vgrajeno funkcijo za korenjenje
def geometricna (a, b):
    """Funkcija vrne geometrično sredino števil a in b."""
    return math.sqrt(a * b)

3. podnaloga

Ker ata Janez v igralnici kar naprej izgublja, se je Mojca odločila, da si bosta priigrane zneske od sedaj naprej delila drugače. Kar bosta priigrala, bosta najprej dala na kup, nato pa bosta dani znesek zaokrožila navzdol na eno decimalko. Ata Janez bo prejel le decimalni del dobljenega zneska, mama Mojca pa preostanek. Oziroma, če bo znesek negativen, bo naslednjič mama Mojca pomagala Janezu priigrati le decimalni del zneska, Janez pa bo moral priigrati vse ostalo.

Če znesek, ki ga priigrata znaša recimo $8.367$ evrov, ga najprej zaokrožita na $8.3$, nato Janez prejme $0.3$ evrov, Mojca pa $8$. Če število $0.3$ pomnožimo z $10$, dobimo $3$, čemur rečemo desetinke števila $8.367$.

Sestavite funkcijo desetinke(x), ki vrne desetinke števila x. Na primer:

>>> desetinke(3.7)
7
>>> desetinke(6.127)
1

Namig : Pomagajte si z vgrajenima funkcijama int in abs.

Uradna rešitev

def desetinke(x):
     """Vrne desetinke števila x."""
     stevilo = 10 * abs(x) # premik decimalne pike v desno.
     # Ker python ostanke negativnih števil pri deljenju šteje drugače, kot si običajno predstavljamo, uporabimo abs
     celi_del = int(stevilo)
     deset = celi_del % 10 # desetinke so enice novega števila
     return deset

4. podnaloga

Mojca in Janez sta se spet domislila nove delitve denarja. V ta namen sta sestavila funkcijo celi_decimalni(x)

def celi_decimalni(x):
     """Vrne celi in decimalni del števila x."""
     celi_del = int(x)
     decimalni_del = 100 * (x - celi_del)
     return celi_del, decimalni_del

ki naj bi vrnila celi del in prvi dve decimalki zneska x tako, kot kažejo spodnji primeri:

>>> celi_decimalni(3.7)
(3, 70)
>>> celi_decimalni(-6.127)
(-6, 12)
>>> celi_decimalni(12.0127)
(12, 1)

A podana funkcija ne dela vedno tako. Poiščite in odpravite napake!

Uradna rešitev

def celi_decimalni(x):
     """Vrne celi in decimalni del števila x."""
     celi_del = int(x)
     x = abs(x)
     decimalni_del = int((x - abs(celi_del))*100)
     return celi_del, decimalni_del
Mesto objave ob koncu projekta 15.9.2018